The ${lua expression} syntax can be used to implement custom widgets. If the Lua expression evaluates to a simple string, it will live preview as that string rendered as markdown. However, if the expression returns a widget.new-generated result value, you can do some fancier stuff.

To render a widget, call widget.new with any of the following keys:

  • markdown: Renders the value as markdown
  • html: Renders a HTML string as a widget. This is somewhat brittle. Therefore, it’s preferred to use the DOM API.
  • display: Render the value either inline or as a block (defaults to inline)


For convenience there are widget.markdown and widget.html wrappers available, see below for examples.

Markdown widgets


DOM widgets

To render a custom HTML-based widget, use the DOM API:

function marquee(text)
  return widget.html(dom.marquee {
    class = "my-marquee",
    onclick = function()
      editor.flashNotification "You clicked me"
    end,
    text
  })
end


We can combine this with some Space Style to style it:

.my-marquee {
  color: purple;
}


Now, let’s use it (try clicking):
${marquee "Finally, marqeeeeeee!"}